package br.com.linkin.web.mi.actions;

import br.com.linkin.cte.constants.Atributos;
import br.com.linkin.mi.utils.log.Logger;
import br.com.linkin.web.mi.forms.BaseForm;
import br.com.linkin.web.mi.vo.Message;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.*;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.util.MessageResources;

public abstract class BaseAction extends DispatchAction {

    /**
     * unspecified method
     *
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @Override
    public ActionForward unspecified(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        this.setMessage(request, "mensagem.acao.inexistente");
        Logger.erro(getMessage(request, "mensagem.acao.inexistente"));
        return mapping.findForward("mensagem");
    }

    /**
     *
     * Retorna uma mensagem internacionalizada
     *
     * @param request
     * @param key
     * @return String
     */
    public String getMessage(HttpServletRequest request, String key) {
        MessageResources message = getResources(request);
        return message.getMessage(key);
    }

    /**
     * Atribui uma messagem de Erro.
     *
     * @param request HttpServletRequest.
     * @param key chave da message. Exemplo: "msg.message.geral"
     * @param paramentros Parâmentros da menssagem.
     */
    public void setMessage(HttpServletRequest request, String key, String... paramentros) {
        setMsg("message", request, key, paramentros);
    }

    /**
     * Atribui uma messagem de Erro.
     *
     * @param request HttpServletRequest.
     * @param key chave da message. Ex "msg.message.geral"
     */
    public void setMessage(HttpServletRequest request, String key) {
        setMsg("message", request, key, null);
    }

    /**
     * Atribui uma messagem de Erro.
     *
     * @param request HttpServletRequest.
     * @param listaMensagemDTO - List chave da message. Ex "msg.message.geral"
     */
    public void setMessage(HttpServletRequest request, List<Message> listaMensagemDTO) {
        setMsg("message", request, listaMensagemDTO);
    }

    /**
     * Atribui uma messagem.
     *
     * @param tipo Tipo da messagem. Exemplo: "erro"
     * @param request HttpServletRequest.
     * @param key chave da message. Exemplo: "msg.message.geral"
     * @param paramentros Parâmentros da menssagem.
     */
    private void setMessage(String tipo, HttpServletRequest request, String key, String[] paramentros) {

        ActionMessages actionMessages = new ActionMessages();

        if (paramentros == null || paramentros.length == 0) {
            actionMessages.add(tipo, new ActionMessage(key));
        } else {
            actionMessages.add(tipo, new ActionMessage(key, paramentros));
        }

        saveMessages(request, actionMessages);
    }

    /**
     * Atribui uma messagem.
     *
     * @param tipo Tipo da messagem. Exemplo: "erro"
     * @param request HttpServletRequest.
     * @param key chave da message. Exemplo: "msg.message.geral"
     * @param paramentros Parâmentros da menssagem.
     */
    private void setMsg(String tipo, HttpServletRequest request, String key, String[] paramentros) {

        ActionErrors actionErrors = new ActionErrors();

        if (paramentros == null || paramentros.length == 0) {
            actionErrors.add(tipo, new ActionMessage(key));
        } else {
            actionErrors.add(tipo, new ActionMessage(key, paramentros));
        }

        saveErrors(request, actionErrors);
    }

    /**
     * Atribui uma messagem.
     *
     * @param tipo Tipo da messagem. Exemplo: "erro"
     * @param request HttpServletRequest.
     * @param key chave da message. Exemplo: "msg.message.geral"
     * @param paramentros Parâmentros da menssagem.
     */
    private void setMsg(String tipo, HttpServletRequest request, List<Message> listaMensagemValidacaoDTO) {

        ActionErrors actionErrors = new ActionErrors();

        for (Message mensagemValidacaoDTO : listaMensagemValidacaoDTO) {

            if (mensagemValidacaoDTO.getParametros() == null || mensagemValidacaoDTO.getParametros().length == 0) {
                actionErrors.add(tipo, new ActionMessage(mensagemValidacaoDTO.getKey()));
            } else {
                actionErrors.add(tipo, new ActionMessage(mensagemValidacaoDTO.getKey(), mensagemValidacaoDTO.getParametros()));
            }
        }

        saveErrors(request, actionErrors);
    }
}
